/*
  名称: TableSelect
  描述: 类似 CRM 主列表勾选逻辑。
  注意: 必须 增加 watch: selectedData 如代码内注释逻辑
*/
import merge from '@/utils/merge'

const DefaultFilterProps = {
  isSelect: false, // 仅选择数据用  禁用数据刷新重置勾选
  showScene: true,
  ignoreFilterFields: [], // 仅用于弹窗选择，高级筛选内将不展示
  showSearch: true,
  showModuleName: true, //  左侧布局
  selectionHandle: true, // 勾选不操作
  radio: false, // 是否单选
  // 搜索
  // 请求和参数
  request: null,
  searchList: null, // 仅用于弹窗选择，叠加一部分筛选条件
  params: null
}

export default {
  data() {
    return {
      // 忽略勾选数据change 避免触发chang事件
      ignoreSelectedChange: false,
      hasExaSelctedData: false // 是否执行过复选
      // 勾选逻辑
    }
  },

  // 用于弹框形式下的配置和数据传入
  props: {
    // 筛选配置
    props: {
      type: Object,
      default: null
    },
    // 筛选选择的数据
    selectedData: Array
  },

  watch: {
    // config 包含的都是弹框筛选逻辑
    // selectedData: {
    //   handler(newVal) {
    //     // 筛选默认值勾选
    //     if (newVal) {
    //       this.tableSelectValidSelectedData(this.selectionList, newVal, rowKey)
    //     }
    //   },
    //   deep: true,
    //   immediate: true
    // }
  },

  computed: {
    config() {
      return merge({ ...DefaultFilterProps }, this.props || {})
    }
  },

  methods: {
    /**
     * @description: 校验选择数据是否与当前勾选数据一致，不一致则重置勾选
     * @param {*} selectionList 勾选的数据
     * @param {*} newVal 传入的勾选数据
     * @param {*} rowKey 主键
     * @return {*}
     */
    tableSelectValidSelectedData(selectionList, newVal, rowKey) {
      let valueEquals = true
      if (newVal.length !== selectionList.length) {
        valueEquals = false
      } else {
        for (let i = 0; i !== newVal.length; ++i) {
          if (newVal[i][rowKey] !== selectionList[i][rowKey]) {
            valueEquals = false
            break
          }
        }
      }

      if (!valueEquals) {
        this.hasExaSelctedData = false
        this.ignoreSelectedChange = true

        setTimeout(() => {
          this.tableSelectSetSelections(this.selectedData).then(() => {
            this.$nextTick(() => {
              this.ignoreSelectedChange = false
            })
          })
        }, 100)
      }
    },

    /**
     * @description:
     * @return {*}
     */
    tableSelectInitSelectedData() {
      if (this.selectedData && !this.hasExaSelctedData) {
        this.hasExaSelctedData = true
        setTimeout(() => {
          this.tableSelectSetSelections(this.selectedData)
        }, 100)
      }
    },

    /**
     * 设置selections值
     */
    tableSelectSetSelections(data) {
      return new Promise((resolve, reject) => {
        const mainTable = this.getMainTable()
        mainTable.clearSelection()
        this.$nextTick(() => {
          data.forEach(item => {
            // const idKey = `${this.crmType}Id`
            // const listItem = this.list.find(lItem => lItem[idKey] === item[idKey])
            // if (listItem) {
            //   mainTable.toggleRowSelection(listItem)
            // }
            mainTable.toggleRowSelection(item)
          })

          resolve()
        })
      })
    },

    /**
     * @description: 获取自定义请求参数
     * @return {*}
     */
    tableSelectGetParams(params) {
      // 用于相关查询 包含Id的参数 需替换为下划线 通过类似高级筛选形式 实现
      if (this.config.params) {
        const searchList = this.config.params.searchList || []
        // 先去除自身包含的同name值的筛选
        if (searchList) {
          if (params.searchList) {
            // 同名称参数以传入的为主
            params.searchList = params.searchList.filter(item => !searchList.some(searchItem => searchItem.name === item.name))
            params.searchList = params.searchList.concat(searchList)
          } else {
            params.searchList = searchList
          }
        }

        for (const key in this.config.params) {
          // 除高级筛选之外的参数传入, 但不修改config.params内的参数
          if (key !== 'searchList') {
            params[key] = this.config.params[key]
          }
        }
      }
      return params
    },

    /**
     * @description: 返回table需要的字符串class
     * @return {*}
     */
    tableSelectGetClass() {
      if (this.config && this.config.radio) {
        return 'no-all-selection'
      }
      return null
    },

    /**
     * 勾选操作
     * @param {*} val
     */
    /**
     * @description: 调整单选数据, 返回true时，仅校准勾选，跳过之后的逻辑
     * @return {*}
     */
    tableSelectValidRadioSelection(val) {
      if (this.ignoreSelectedChange) {
        return true
      }

      // 单选操作
      if (this.config.radio && val.length > 1) {
        const mainTable = this.getMainTable()
        const lastObj = val[val.length - 1]
        this.ignoreSelectedChange = true
        mainTable.clearSelection()
        this.$nextTick(() => {
          this.ignoreSelectedChange = false
          mainTable.toggleRowSelection(lastObj)
        })
        return true
      }

      return false
    },

    /**
     * @description: 获取table
     * @return {*}
     */
    getMainTable() {
      let table = null
      this.$children.forEach(item => {
        if (item.$options && item.$options.name === 'ElTable') {
          table = item
        }
      })
      return table
    }
  }
}
